package reading.data.mapper;

import org.apache.ibatis.annotations.Param;
import reading.mybatis.Pageable;

import java.util.List;
import java.util.Map;

/**
 * Project: reading-system
 * Package: reading.data.mapper
 *
 * @author : txw
 * @version : v1.1
 * @since : 2018/5/28 11:13
 */
public interface BaseDbMapper<T> {
    /**
     * 批量创建 id 自动生成
     *
     * @param t
     */
    void create(T t);

    /**
     * 创建实体 id 非自动生成
     * @param t
     */
    void createWithId(T t);
    /**
     * 批量创建
     *
     * @param list
     */
    void createBatch(List<T> list);

    /**
     * 通过id 查询
     *
     * @param id
     * @return
     */
    T findById(Long id);

    /**
     * 通过id 查询
     *
     * @param id
     * @return
     */
    T findByStrId(String id);

    /**
     * 分页查询
     *
     * @param pageable
     * @return
     */
    List<T> findPage(Pageable pageable);

    /**
     * 管理员分页查询
     *
     * @param pageable
     * @return
     */
    List<T> findGainPage(Pageable pageable);



    /**
     * dto  查询
     *
     * @param pageable
     * @param <S>
     * @return
     */
    <S> List<S> findDtoPage(Pageable pageable);

    /**
     * 统计数量
     *
     * @param pageable
     * @return
     */
    long countPage(Pageable pageable);

    /**
     * 更新对象
     *
     * @param t
     * @return
     */
    int update(T t);

    /**
     * 通过id 删除
     *
     * @param id
     */
    void deleteById(Long id);

    /**
     * 通过id 删除
     *
     * @param id
     */
    void deleteByStrId(String id);

    /**
     * 查询所有数据
     *
     * @return
     */
    List<Map<String, Object>> findAllMap();

    /**
     * 分页 查询所有数据
     *
     * @param pageable
     * @return
     */
    List<Map<String, Object>> findAllMapPage(Pageable pageable);

    /**
     * 查询所有
     *
     * @return
     */
    List<T> findAll();

    /**
     * 查询所有
     *
     * @param <S>
     * @return
     */
    <S> List<S> findDtoAll();

    /**
     * 通过用户查询所有
     *
     * @param userId
     * @param <S>
     * @return
     */
    <S> List<S> findDtoUserAll(@Param("userId") Long userId);

    /**
     * 实体所有数据树形结构
     *
     * @return
     */
    List<T> findTree();

    /**
     * 更具名称查询
     *
     * @param name
     * @return
     */
    T equalName(@Param("name") String name);

    /**
     * 只是更新状态
     *
     * @param id
     * @param status
     */
    void updateStatus(@Param("id") Long id, @Param("status") String status);
}
